package com.ruoyi.framework.config;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;

@WebFilter("/*") // 过滤所有请求Ø
public class TimeFormatFilter implements Filter {

    public void init(FilterConfig filterConfig) throws ServletException {
        // 初始化方法，可以用于过滤器的配置
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {

        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpServletResponse httpResponse = (HttpServletResponse) response;

        // 处理请求参数中的日期字段
        Map<String, String[]> parameterMap = httpRequest.getParameterMap();
        for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
            String parameterName = entry.getKey();
            String[] parameterValues = entry.getValue();

            for (int i = 0; i < parameterValues.length; i++) {
                String parameterValue = parameterValues[i];
                if (isValidDateFormat(parameterValue)) {
                    try {
                        Date normalizedDate = normalizeDate(parameterValue);
                        // 替换原有日期字段值
                        parameterValues[i] = normalizedDate.toString();
                    } catch (ParseException e) {
                        // 如果日期格式不支持，可以设置一个错误响应或跳转到错误页面
                        httpResponse.sendError(HttpServletResponse.SC_BAD_REQUEST, "Invalid date format for parameter: " + parameterName);
                        return;
                    }
                }
            }
        }

        // 将处理后的参数传递给过滤器链
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
        // 销毁时的清理工作
    }

    // 检查字符串是否符合日期格式
    private boolean isValidDateFormat(String str) {
        try {
            // 尝试解析为日期，如果能解析就认为是日期格式
            normalizeDate(str);
            return true;
        } catch (ParseException e) {
            return false;
        }
    }

    // 日期格式化的转换方法
    private Date normalizeDate(String dateStr) throws ParseException {
        // 定义两种日期格式
        SimpleDateFormat formatWithTime = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
        SimpleDateFormat formatWithoutTime = new SimpleDateFormat("yyyy-MM-dd");

        try {
            // 先尝试解析带有时间戳的日期格式（例如：2025-03-02T10:15:30.000Z）
            return formatWithTime.parse(dateStr);
        } catch (ParseException e1) {
            // 如果解析失败，尝试解析没有时间戳的日期格式（例如：2025-03-02）
            return formatWithoutTime.parse(dateStr);
        }
    }
}
